/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._405;

/**
 * 给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。
 * <p>
 * 注意:
 * <p>
 * 十六进制中所有字母(a-f)都必须是小写。
 * 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 
 * 给定的数确保在32位有符号整数范围内。
 * 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
 * 示例 1：
 * <p>
 * 输入:
 * 26
 * <p>
 * 输出:
 * "1a"
 * 示例 2：
 * <p>
 * 输入:
 * -1
 * <p>
 * 输出:
 * "ffffffff"
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._405
 * @ClassName: ConvertToHex
 * @Author: linyaonan
 * @Date: 2019/12/26 16:43
 */
public class ConvertToHex {

    public String toHex(int num) {
        if (num == 0) {
            return "0";
        } else if (num > 0) {
            return getPositiveHex(num);
        } else {
            return getNegativeHex(num);
        }
    }

    /**
     * 处理正数
     * @param num num
     * @return r
     */
    private String getPositiveHex(long num) {
        StringBuilder sb = new StringBuilder();
        while (num >= 16) {
            long t = num % 16;
            sb.append(getHexFromNum(t));
            num = num / 16;
        }
        sb.append(getHexFromNum(num % 16));
        return sb.reverse().toString();
    }

    /**
     * 处理负数
     * @param num num
     * @return r
     */
    private String getNegativeHex(int num) {
        // 获取正码
        return getPositiveHex(4294967295L + num + 1);
    }

    private String getHexFromNum(long num) {
        if (num <= 9) {
            return String.valueOf(num);
        } else {
            char t = (char) ((num - 10) + 'a');
            return t + "";
        }
    }
}
